import { BaseStorageService, PROJECT_CONFIG, StorageConfig } from './storage/baseStorageService';

// 股票投资计划数据接口
export interface SavedStockInvestPlan {
  id: string;
  stockCode: string;
  stockName: string;
  currentPrice: number;           // 当前股价
  maxDrawdown: number;           // 历史最大回撤
  totalShares: number;           // 目标总份额（必须是100的整数倍）
  buyTimes: number;              // 计划买入次数
  strategy: string;              // 投资策略
  averagePrice: number;          // 预期平均成本
  riskLevel: string;             // 风险等级
  maxLoss: number;               // 最大可能亏损
  totalAmount: number;           // 总投资金额（计算得出）
  
  // 股票特有字段
  minLots: number;               // 最小购买手数（通常为1手=100股）
  lotSize: number;               // 每手股数（通常为100）
  marketType: 'A股' | '港股' | '美股'; // 市场类型
  
  createdAt: string;
  updatedAt: string;
}

// 股票投资计划服务类
class StockInvestPlanService extends BaseStorageService<SavedStockInvestPlan> {
  constructor(config: StorageConfig = { type: 'indexedDB' }) {
    // 使用项目统一配置中定义的股票投资计划存储名称
    super(PROJECT_CONFIG.STORE_NAMES.STOCK_PLANS, config);
  }

  // 业务特定的方法 - 保存股票投资计划
  async saveStockInvestPlan(plan: SavedStockInvestPlan): Promise<void> {
    // 验证股票特有的业务规则
    this.validateStockPlan(plan);
    return this.save(plan);
  }

  // 业务特定的方法 - 获取所有股票投资计划
  async getStockInvestPlans(): Promise<SavedStockInvestPlan[]> {
    return this.getAll();
  }

  // 业务特定的方法 - 根据ID获取股票投资计划
  async getStockInvestPlanById(id: string): Promise<SavedStockInvestPlan | null> {
    return this.getById(id);
  }

  // 业务特定的方法 - 删除股票投资计划
  async deleteStockInvestPlan(id: string): Promise<void> {
    return this.delete(id);
  }

  // 业务特定的方法 - 批量删除股票投资计划
  async deleteStockInvestPlans(ids: string[]): Promise<void> {
    return this.deleteMany(ids);
  }

  // 业务特定的方法 - 根据股票代码查询
  async getStockInvestPlansByCode(stockCode: string): Promise<SavedStockInvestPlan[]> {
    const allPlans = await this.getStockInvestPlans();
    return allPlans.filter(plan => plan.stockCode === stockCode);
  }

  // 业务特定的方法 - 根据市场类型查询
  async getStockInvestPlansByMarket(marketType: SavedStockInvestPlan['marketType']): Promise<SavedStockInvestPlan[]> {
    const allPlans = await this.getStockInvestPlans();
    return allPlans.filter(plan => plan.marketType === marketType);
  }

  // 业务特定的方法 - 根据风险等级查询
  async getStockInvestPlansByRiskLevel(riskLevel: string): Promise<SavedStockInvestPlan[]> {
    const allPlans = await this.getStockInvestPlans();
    return allPlans.filter(plan => plan.riskLevel === riskLevel);
  }

  // 业务特定的方法 - 获取股票投资统计信息
  async getStockInvestmentStatistics(): Promise<{
    totalPlans: number;
    totalInvestment: number;
    totalShares: number;
    averageAmount: number;
    marketDistribution: Record<string, number>;
    riskDistribution: Record<string, number>;
  }> {
    const plans = await this.getStockInvestPlans();
    
    return {
      totalPlans: plans.length,
      totalInvestment: plans.reduce((sum, plan) => sum + plan.totalAmount, 0),
      totalShares: plans.reduce((sum, plan) => sum + plan.totalShares, 0),
      averageAmount: plans.length > 0 ? plans.reduce((sum, plan) => sum + plan.totalAmount, 0) / plans.length : 0,
      marketDistribution: plans.reduce((acc, plan) => {
        acc[plan.marketType] = (acc[plan.marketType] || 0) + 1;
        return acc;
      }, {} as Record<string, number>),
      riskDistribution: plans.reduce((acc, plan) => {
        acc[plan.riskLevel] = (acc[plan.riskLevel] || 0) + 1;
        return acc;
      }, {} as Record<string, number>)
    };
  }

  // 验证股票投资计划的业务规则
  private validateStockPlan(plan: SavedStockInvestPlan): void {
    // 验证份额必须是手数的整数倍
    if (plan.totalShares % plan.lotSize !== 0) {
      throw new Error(`股票份额必须是${plan.lotSize}的整数倍`);
    }

    // 验证最小购买手数
    if (plan.totalShares < plan.minLots * plan.lotSize) {
      throw new Error(`股票份额不能少于${plan.minLots}手（${plan.minLots * plan.lotSize}股）`);
    }

    // 验证股票代码格式（简单验证）
    if (!plan.stockCode || plan.stockCode.length < 4) {
      throw new Error('股票代码格式不正确');
    }

    // 验证价格
    if (plan.currentPrice <= 0) {
      throw new Error('股票价格必须大于0');
    }
  }

  // 计算股票投资计划的总金额
  calculateTotalAmount(shares: number, averagePrice: number): number {
    return shares * averagePrice;
  }

  // 计算手数
  calculateLots(shares: number, lotSize: number = 100): number {
    return Math.floor(shares / lotSize);
  }

  // 验证并调整份额为手数的整数倍
  adjustSharesToLots(shares: number, lotSize: number = 100): number {
    return Math.floor(shares / lotSize) * lotSize;
  }
}

// 创建默认服务实例
export const stockInvestPlanService = new StockInvestPlanService({
  type: 'indexedDB'
});

// 导出服务类
export { StockInvestPlanService };